/*
 * AlumnoFachada.java
 * Intuition Technologies. Todos los derechos reservados.
 */
package mx.com.asteca.fachada;

import java.util.List;

import mx.com.asteca.comun.dto.AlumnoDTO;
import mx.com.asteca.comun.dto.AlumnoDocumentoDTO;
import mx.com.asteca.comun.dto.AsentamientoDTO;
import mx.com.asteca.comun.dto.EstadoDTO;
import mx.com.asteca.comun.dto.EstatusDTO;
import mx.com.asteca.comun.dto.MunicipioDTO;
import mx.com.asteca.comun.dto.TipoEstudioDTO;
import mx.com.asteca.comun.dto.TipoLicenciaDTO;

/**
 * Interfaz de acceso a la fachada para AlumnoDTO
 * 
 * @author Jorge Amaro Coria
 * @version 1.0
 * @since 1.0
 * 
 */
public interface AlumnoFachada extends BaseFachada<AlumnoDTO, Integer> {

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por matricula
	 * 
	 * @param matricula
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByMatricula(String matricula) throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por nombreCompleto
	 * 
	 * @param nombreCompleto
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByNombre(String nombreCompleto) throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por estatus
	 * 
	 * @param estatus
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByEstatus(String estatus) throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por matricula y nombreCompleto
	 * 
	 * @param matricula
	 * @param nombreCompleto
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByMatriculaAndNombre(String matricula,
			String nombreCompleto) throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por matricula y estatus
	 * 
	 * @param matricula
	 * @param estatus
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByMatriculaAndStatus(String matricula, String estatus)
			throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por nombreCompleto y estatus
	 * 
	 * @param nombreCompleto
	 * @param estatus
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByNombreAndStatus(String nombreCompleto, String estatus)
			throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por area
	 * 
	 * @param area
	 * @param estatus
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByArea(Integer idArea) throws FachadaException;

	/**
	 * Obtiene la lista de AlumnoDTO filtrada por matricula, nombreCompleto y
	 * estatus
	 * 
	 * @param matricula
	 * @param nombreCompleto
	 * @param estatus
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> findByMatriculaNombreAndStatus(String matricula,
			String nombreCompleto, String estatus) throws FachadaException;

	/**
	 * Llena las propiedades de un objeto {@code AlumnoDTO} con base en su ID
	 * 
	 * @param alumnoID
	 * @return
	 * @throws FachadaException
	 */
	AlumnoDTO populate(int alumnoID) throws FachadaException;

	/**
	 * Obtiene una lista de los distintos CPs en formato de numero
	 * 
	 * @return
	 * @throws FachadaException
	 */
	List<Integer> getDistincCPs() throws FachadaException;

	/**
	 * Obtiene una lista de {@code AsentamientoDTO} con base en el CP
	 * 
	 * @param cp
	 * @return
	 * @throws FachadaException
	 */
	List<AsentamientoDTO> findAsentamientosByCp(int cp) throws FachadaException;

	/**
	 * Obtiene un municipio con base en su id y el id del estado
	 * 
	 * @param idMunicipio
	 * @param idEstado
	 * @return
	 * @throws FachadaException
	 */
	MunicipioDTO findMunicipio(int idMunicipio, int idEstado)
			throws FachadaException;

	/**
	 * Busca el Estado con base en su ID
	 * 
	 * @param idEstado
	 * @return
	 * @throws FachadaException
	 */
	EstadoDTO findEstado(int idEstado) throws FachadaException;

	/**
	 * Obtiene una lista de todos los objetos {@code TipoLicenciaDTO}
	 * 
	 * @return
	 * @throws FachadaException
	 */
	List<TipoLicenciaDTO> getTiposLicencia() throws FachadaException;

	/**
	 * Obtiene un Tipo de Licencia con base en su ID
	 * 
	 * @param idTipoLicencia
	 * @return
	 * @throws FachadaException
	 */
	TipoLicenciaDTO getLicencia(int idTipoLicencia) throws FachadaException;

	/**
	 * Obtiene una lista de los distintos {@code TipoEstudioDTO}
	 * 
	 * @return
	 * @throws FachadaException
	 */
	List<TipoEstudioDTO> getTiposEstudios() throws FachadaException;

	/**
	 * Obtiene un registro de {@code AsentamientoDTO} con base en su id, el id
	 * del municipio y el id del estado
	 * 
	 * @param idAsentamiento
	 * @param idMunicipio
	 * @param idEstado
	 * @return
	 * @throws FachadaException
	 */
	AsentamientoDTO findAsentamiento(int idAsentamiento, int idMunicipio,
			int idEstado) throws FachadaException;

	/**
	 * Obtiene la lista de {@code EstatusDTO}
	 * 
	 * @return
	 * @throws FachadaException
	 */
	List<EstatusDTO> getEstatus() throws FachadaException;

	/**
	 * Obtiene una lisa de {@code AlumnoDTO} con sus datos básicos para
	 * pintarlos en la tabla
	 * 
	 * @return
	 * @throws FachadaException
	 */
	List<AlumnoDTO> getAlumnosDatosBasicos() throws FachadaException;

	/**
	 * Obtiene la ruta de carga/descarga de documentos
	 * 
	 * @return
	 * @throws FachadaException
	 */
	String getRuta() throws FachadaException;

	/**
	 * Verifica si existe el Alumno buscando por su matricula
	 * 
	 * @param matricula
	 * @return
	 * @throws FachadaException
	 */
	boolean existsByMatricula(String matricula) throws FachadaException;

	int getDiasParaTerminarCurso(int idAlumno) throws FachadaException;

	int saveDocumentoPorAlumno(AlumnoDocumentoDTO dto) throws FachadaException;

}
